DAPP挖矿开发详情丨DAPP挖矿系统开发(开发逻辑)丨DAPP挖矿系统源码交付

简介: 简单来说,DApp和普通App的原理是一样的,只不过它们是完全去中心化的。DAPP像以太√坊网络本身一样由自己的节点运营,不依赖于任何集中式服务器。DAPP是去中心化的,可以完全自动运行。

  区块链作为一个基础设施,提供了一个分布式去中心化的可信数据库。基于此,人们可以针对不同的场景开发各种应用。

  简单来说,DApp和普通App的原理是一样的,只不过它们是完全去中心化的。DAPP像以太√坊网络本身一样由自己的节点运营,不依赖于任何集中式服务器。DAPP是去中心化的,可以完全自动运行。

  目前,DApp通常是指在以太√坊或EOS上基于智能合约开发的相关应用。

  swap是普通用户进行代币交易的操作。普通用户通过swap操作实现两种token之间的交易。

  function swapExactTokensForTokens

  uint amountIn,

  uint amountOutMin,

  address[]calldata path,

  address to,

  uint deadline

  )external virtual override ensure(deadline)returns(uint[]memory amounts){

  Uniswap支持多种代币的交换。具体的含义是,Uniswap提供了多级交易池的路由功能。

  举个例子,已有两个交易对TokenA-TokenB,以及TokenB-TokenC,通过swap接口,可以实现TokenA-TokenC的交换,其中经过的TokenA-TokenB,TokenB-TokenC,称为路径(path)。amountIn是路径中的第一个代币的数量,amountOutMin是期望的交换后的最少的数量。

  amounts=UniswapV2Library.getAmountsOut(factory,amountIn,path);

  require(amounts[amounts.length-1]>=amountOutMin,‘UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT’);

  amounts是每个路径上的交换后的数量。amounts[amounts.length-1]也就是最后一条路径的输出数量。

  注意,UniswapV2Library.getAmountsOut的实现(在获取每个交易对的reserve信息后,调用getAmountOut函数):

  function getAmountOut(uint amountIn,uint reserveIn,uint reserveOut)internal pure returns(uint amountOut){

  require(amountIn>0,'UniswapV2Library:INSUFFICIENT_INPUT_AMOUNT');

  require(reserveIn>0&&reserveOut>0,'UniswapV2Library:INSUFFICIENT_LIQUIDITY');

  uint amountInWithFee=amountIn.mul(997);

  uint numerator=amountInWithFee.mul(reserveOut);

  uint denominator=reserveIn.mul(1000).add(amountInWithFee);

  amountOut=numerator/denominator;

  }

  TransferHelper.safeTransferFrom(

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

  );

  将代币path[0],转入到交易对,数量为amounts[0]。转入代币后,进行真正的swap操作:

  function _swap(uint[]memory amounts,address[]memory path,address _to)internal virtual{

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

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

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

  uint amountOut=amounts[i+1];

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

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

  IUniswapV2Pair(UniswapV2Library.pairFor(factory,input,output)).swap(

  amount0Out,amount1Out,to,new bytes(0)

  );

  }

  }

  原理比较简单,针对每一条路径,调用交易对的swap操作。

  Core逻辑

  Core逻辑实现了单个交易对的逻辑。通过UniswapV2Factory可以创建一个个Pair(交易池)。每个具体实现逻辑在UniswapV2Pair中。

  mint

  每个交易对创建流动性。

  function mint(address to)external lock returns(uint liquidity){

  因为在调用mint函数之前,在addLiquidity函数已经完成了转账,所以,从这个函数的角度,两种代币数量的计算方式如下:

  uint balance0=IERC20(token0).balanceOf(address(this));

  uint balance1=IERC20(token1).balanceOf(address(this));

  uint amount0=balance0.sub(_reserve0);

  uint amount1=balance1.sub(_reserve1);

  当前的balance是当前的reserve加上注入的流动性的代币数量。

  uint _totalSupply=totalSupply;//gas savings,must be defined here since totalSupply can update in _mintFee

  if(_totalSupply==0){

  liquidity=Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);

  _mint(address(0),MINIMUM_LIQUIDITY);//permanently lock the first MINIMUM_LIQUIDITY tokens

  }else{

  liquidity=Math.min(amount0.mul(_totalSupply)/_reserve0,amount1.mul(_totalSupply)/_reserve1);

  }

  _mint(to,liquidity);

  流动性liquidity的计算方式在第一次提供流动性时和其他时候稍稍不同。第一次提供流动性的计算公式如下:

  liquidity=sqrt(x0*y0)-min

  其中min是10^3。也就是说,第一次提供流动性是有最小流动性要求的。其他提供流动性的计算公式如下:

  liquidity=min((x0/reserve0totalsupply),(y0/reserve1totalsupply))

  也就说,按照注入的流动性和当前的reserve的占比一致。

  burn

  burn函数用在抽取流动性。burn逻辑和mint逻辑类似。

  function burn(address to)external lock returns(uint amount0,uint amount1){

  3.swap

  swap函数实现两种代币的兑换。

  function swap(uint amount0Out,uint amount1Out,address to,bytes calldata data)external lock{

  一个交易池的swap操作支持两个方向的兑换,可以从TokenA换到TokenB,或者TokenB换到TokenA。

  if(amount0Out>0)_safeTransfer(_token0,to,amount0Out);//optimistically transfer tokens

  if(amount1Out>0)_safeTransfer(_token1,to,amount1Out);//optimistically transfer tokens

  因为在swapExactTokensForTokens的getAmountOut函数已经确定兑换处的金额。所以,先直接转账。

  在不做swap之前,balance应该和reserve相等的。通过balance和reserve的差值,可以反推出输入的代币数量:

  uint amount0In=balance0>_reserve0-amount0Out?balance0-(_reserve0-amount0Out):0;

  uint amount1In=balance1>_reserve1-amount1Out?balance1-(_reserve1-amount1Out):0;

  确保反推的输入代币数量不小于零。

  require(amount0In>0||amount1In>0,‘UniswapV2:INSUFFICIENT_INPUT_AMOUNT’);

相关文章
|
6月前
|
算法 大数据 分布式数据库
DAPP质押模式系统开发项目方案|DAPP合约开发案例
区块链技术是一种分布式数据库技术,它是由多个节点构成的去中心化网络
|
网络安全 区块链
DAPP去中心化项目系统开发|DAPP质押流程分析
去中心化融需要去中心化的发行方式与之匹配package com.hou.test1;
|
JavaScript 前端开发 Go
区块链Dapp智能合约系统开发(开发功能)丨dapp/defi代币合约项目系统开发成熟案例版及源码部署
The following are important technical points in the development process of smart contract DApp:
DAPP去中心化交易所系统开发详细功能丨DAPP去中心化钱包系统开发规则详细/成熟技术/源码说明
 A smart contract is a computer program that runs on a blockchain. Programs include functions and data (also known as variables or parameters), which operate on data. The data used by the function needs to be stored in the computer's memory
|
Go 区块链
以太坊挖矿系统开发二开源码
以太坊挖矿系统开发二开源码
|
区块链
dapp质押挖矿系统开发设计概述
DApp(去中心化应用)质押挖矿系统是基于区块链技术构建的一种去中心化应用,它结合了质押和挖矿的概念,让用户可以通过质押代币来参与挖矿活动并获得相应的奖励。
|
存储 人工智能 边缘计算
什么是DAPP智能合约系统开发?DAPP智能合约流动性质押挖矿分红逻辑系统开发详情方案及设计
  Web 3.0:指的移动互联网后的下一个阶段的互联网生态,主要是通过区块链等技术手段,实现去中心化的网络形态,实现模拟真实世界感受、打破虚拟、现实边界的互联网;
什么是DAPP智能合约系统开发?DAPP智能合约流动性质押挖矿分红逻辑系统开发详情方案及设计
|
区块链
详细分析:多链质押挖矿系统开发合约部署方案详细教程
详细分析:多链质押挖矿系统开发合约部署方案详细教程
详细分析:多链质押挖矿系统开发合约部署方案详细教程