首頁>技術>

在前一個教程中,我們介紹了 套利機器人背後的三個主要概念:套利、基於合約的交易和樂觀轉賬。在本文中,我們將逐步介紹如何 利用nodejs和solidity構建套利機器人程式,以監視uniswap和sushiswap上的潛在套利機會並執行有利可圖的套利交易。

用自己熟悉的語言學習 以太坊DApp開發 : Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart

下面是我們的套利機器人的總體流程:

機器人程式/Bot跟蹤Uniswap和Sushiswap上的交易對當發現有利可圖的套利機會時,套利機器人將交易傳送給我們已部署的合約在一個交易中,合約將執行如下操作:使用閃電兌換從價格較低的資產池借入資產立即在價格較高的資產池售出資產償還閃電兌換貸款並收穫差額利潤1、DEX套利機器人使用的技術棧

教程中使用的技術棧如下:

Node.js:基礎執行環境Ethers.js:以太坊JS開發庫Infura:提供以太坊接入訪問點Solidity:套利智慧合約

後端採用Node開發,使用Infura節點來跟蹤Uniswap和Sushiswap合約中ETH和Dai的價格。 我們利用Infura端點來獲取主網上產出的每個新區塊上的價格。

我們之所以使用Ethers.js,是因為它與Typescript(專案的原始語言)相容。對於以太坊開發人員 來說這是一個古老的問題,但有關ethers.js和web3.js之間的區別,請參閱這篇文章。

2、使用.env儲存套利機器人的敏感資訊

這是非常重要的!由於需要儲存私鑰來簽署主網交易,我們將所有敏感資訊都放在.env檔案中, 此外,套利合約的地址和Infura主網端點的key也存入該檔案:

PRIVATE_KEY=FLASH_LOANER=INFURA_KEY=

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

如果你不確定我們為什麼這樣做,請閱讀這篇文章, 它解釋瞭如何避免將私鑰上傳到Github。如文章所述,我們需要將敏感資訊放入此.env檔案中,然後 將其新增到.gitignore檔案中,如下所示:

.envyarn.lockpackage-lock.jsonnode_modules

這樣,當我們將資訊推送到Github時,將不包括該檔案在內。這一點超級、超級重要!

3、DEX合約例項化

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

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

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

4、定期檢查套利機會

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

provider.on('block', async (blockNumber) => {    try {      console.log(blockNumber);      const sushiReserves = await sushiEthDai.getReserves();      const uniswapReserves = await uniswapEthDai.getReserves();[...]  }}
5、關於提前交易/Front Running

提前交易在中心化金融交易中很常見,通常利用資料速度獲取微小的優勢。 我們不必為此擔心太多,因為Uniswap和Sushiswap是去中心化交易所。它們的價格保持在鏈上, 並且逐塊變化。

即使我們想以某種方式在網路主體之前獲取資訊,唯一能採取行動的方法是將交易包括在 下一個區塊中,這對所有人都是可見的。我們需要支付高昂的GAS費來阻止搶先交易, 但這大概是最大的收益。

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

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

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

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

基本上,合約是我們的套利中介。當程式檢測到有利可圖的機會時,它將向該合約傳送資金和交易指令。

我們的套利合約相對還是比較簡單的。大多數程式碼來自Uniswap的示例程式碼。

合約的建構函式,可以傳入一些硬編碼的資料,例如Uniswap和Sushiswap的合約地址。合約還有一個 函式uniswapV2Call,我們在其中以樂觀方式從一個交易所借入代幣,在另一個交易所執行交換, 然後立即償還第一筆借款:

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);      }}

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

8、套利機器人教程小節

儘管此程式碼還不適用於生產環境,但我們希望它能說明閃電交換的基本概念,同時我們也希望它 能夠展示出這個僅在區塊鏈上可能存在的簡單工具的強大功能!

原文連結:http://blog.hubwiz.com/2021/01/29/flashloan-arbitrage-bot-tutorial-2/

23
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 行內函數&帶'#'號的例子(C)