dapp元宇宙鏈遊開發【詳情】技術實現及原始碼實現方式

丸子qy發表於2023-05-19


  什麼是dApp和Web3應用?

  

  如果不提及dApp,關於Web3的討論就不會完整。簡而言之,dApp或去中心化應用程式是Web3革命的支柱。術語“Web3應用程式”、“Web3應用程式”、“去中心化應用程式”、“dApps”或“Web3 dApps”在很大程度上都是同義詞。它們都指作為Web3一部分的分散的、通常基於區塊鏈的應用程式。

  

  那麼,什麼是Web3應用程式?許多dApp或Web3應用程式的一個組成部分是所謂的“智慧合約”。有區塊鏈技術經驗的人可能熟悉智慧合約的概念。智慧合約本質上是自動執行的軟體協議,是在以太坊區塊鏈等區塊鏈上執行的程式碼片段。這些會自動“執行”,或在滿足一組相關條款時執行。因此,這些“合約”可以自動驗證和執行不同方之間的交易。

  

  內部函式(僅供合約內部呼叫)

  

  _swapSupportingFeeOnTransferTokens

  

  程式碼速瀏覽

  

  function _swapSupportingFeeOnTransferTokens(address[]memory path,address _to)internal virtual{

  

  for(uint i;i<path.length-1;i++){ DAPP鏈遊開發176應用0206詳細5616

  

  (address input,address output)=(path<i>,path[i+1]);

  

  (address token0,)=UniswapV2Library.sortTokens(input,output);

  

  IUniswapV2Pair pair=IUniswapV2Pair(UniswapV2Library.pairFor(factory,input,output));

  

  uint amountInput;

  

  uint amountOutput;

  

  {

  

  (uint reserve0,uint reserve1,)=pair.getReserves();

  

  (uint reserveInput,uint reserveOutput)=input==token0?(reserve0,reserve1):(reserve1,reserve0);

  

  amountInput=IERC20(input).balanceOf(address(pair)).sub(reserveInput);

  

  amountOutput=UniswapV2Library.getAmountOut(amountInput,reserveInput,reserveOutput);

  

  }

  

  (uint amount0Out,uint amount1Out)=input==token0?(uint(0),amountOutput):(amountOutput,uint(0));

  

  address to=i<path.length-2?UniswapV2Library.pairFor(factory,output,path[i+2]):_to;

  

  pair.swap(amount0Out,amount1Out,to,new bytes(0));

  

  引數分析

  

  函式swapETHForExactTokens的入參有2個,出參有0個,對應的解釋如下:

  

  function _swapSupportingFeeOnTransferTokens( DAPP鏈遊開發威:wwqqyy420

  

  address[]memory path,//交易路徑列表

  

  address _to//交易獲得的token傳送到的地址

  

  )internal virtual{

  

  函式_swapSupportingFeeOnTransferTokens相比函式_swap為了支援path中有交易後可變數量的代幣,不需要輸入amounts,但需要額外做一些操作。

  

  實現分析

  

  ……

  

  {

  

  //迴圈交易路徑列表

  

  for(uint i;i<path.length-1;i++){

  

  //從path中取出input和output

  

  (address input,address output)=(path<i>,path[i+1]);

  

  //從input和output中算出誰是token0

  

  (address token0,)=UniswapV2Library.sortTokens(input,output);

  

  //獲得input,output的流動池

  

  IUniswapV2Pair pair=IUniswapV2Pair(UniswapV2Library.pairFor(factory,input,output));

  

  uint amountInput;

  

  uint amountOutput;

  

  {

  

  //獲取流動池庫存reserve0,reserve1

  

  (uint reserve0,uint reserve1,)=pair.getReserves();

  

  //如果input==token0,那麼(reserveInput,reserveOutput)就是(reserve0,reserve1);反之則相反

  

  (uint reserveInput,uint reserveOutput)=input==token0?(reserve0,reserve1):(reserve1,reserve0);

  

  //amountInput等於流動池餘額減去reserveInput

  

  amountInput=IERC20(input).balanceOf(address(pair)).sub(reserveInput);

  

  //獲取amountOutput

  

  amountOutput=UniswapV2Library.getAmountOut(amountInput,reserveInput,reserveOutput);

  

  }

  

  //如果input==token0,那麼amount0Out就是0,amount1Out就是amountOut;反之則相反

  

  (uint amount0Out,uint amount1Out)=input==token0?(uint(0),amountOutput):(amountOutput,uint(0));

  

  //如果這是最後的一筆交易,那麼to地址就是_to,否則to地址是下一筆交易的流動池地址

  

  address to=i<path.length-2?UniswapV2Library.pairFor(factory,output,path[i+2]):_to;

  

  //執行input和output的交易

  

  pair.swap(amount0Out,amount1Out,to,new bytes(0));

  

  總結

  

  可以看到,因為沒有amounts,需要使用流動池餘額減去庫存來計算amountInput。

  

  外部函式(僅供合約外部呼叫)

  

  swapExactTokensForTokensSupportingFeeOnTransferTokens

  

  程式碼速瀏覽

  

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(

  

  uint amountIn,

  

  uint amountOutMin,

  

  address[]calldata path,

  

  address to,

  

  uint deadline

  

  )external virtual override ensure(deadline){

  

  TransferHelper.safeTransferFrom(

  

  path[0],msg.sender,UniswapV2Library.pairFor(factory,path[0],path[1]),amountIn

  

  );

  

  uint balanceBefore=IERC20(path[path.length-1]).balanceOf(to);

  

  _swapSupportingFeeOnTransferTokens(path,to);

  

  require(

  

  IERC20(path[path.length-1]).balanceOf(to).sub(balanceBefore)>=amountOutMin,

  

  'UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT'

  

  引數分析

  

  函式swapExactTokensForTokensSupportingFeeOnTransferTokens的入參有5個,出參有0個,對應的解釋如下:

  

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(

  

  uint amountIn,//交易支付代幣數量

  

  uint amountOutMin,//交易獲得代幣最小值

  

  address[]calldata path,//交易路徑列表

  

  address to,//交易獲得的token傳送到的地址

  

  uint deadline//過期時間

  

  )external virtual override ensure(deadline){

  

  函式swapExactTokensForTokensSupportingFeeOnTransferTokens相比函式swapExactTokensForTokens,少了amounts,因為交易後可變數量的代幣不能做amounts的預測。

  

  實現分析

  

  ……

  

  //檢查交易是否過期

  

  ensure(deadline)

  

  {

  

  //將amountIn數量的path[0]代幣從使用者賬戶中轉移到path[0],path[1]的流動池

  

  TransferHelper.safeTransferFrom(

  

  path[0],msg.sender,UniswapV2Library.pairFor(factory,path[0],path[1]),amountIn

  

  );

  

  //記錄to地址path[path.length-1]代幣的餘額

  

  uint balanceBefore=IERC20(path[path.length-1]).balanceOf(to);

  

  //按path列表執行交易集合

  

  _swapSupportingFeeOnTransferTokens(path,to);

  

  //如果to地址獲得的代幣數量小於amountOutMin,交易失敗

  

  require(

  

  IERC20(path[path.length-1]).balanceOf(to).sub(balanceBefore)>=amountOutMin,

  

  'UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT'

  

  );

  

  }

  

  該函式適用於支付確定數量的代幣,獲得不定數量的代幣,且在path路徑列表中有交易後數量可變的代幣。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70029396/viewspace-2953408/,如需轉載,請註明出處,否則將追究法律責任。

相關文章