DAPP流动性矿池挖矿分红开发丨DAPP流动性矿池挖矿分红系统开发详细及逻辑丨DAPP流动性矿池挖矿分行系统源码部署

简介:   Smart contract:Smart contract is a program running on the ETH blockchain,which defines the logic behind the state changes on the blockchain.In abstract,smart contract is a rule that can be executed automatically.In real life,a contract needs to have a special execution role after the contract is f

  Smart contract:Smart contract is a program running on the ETH blockchain,which defines the logic behind the state changes on the blockchain.In abstract,smart contract is a rule that can be executed automatically.In real life,a contract needs to have a special execution role after the contract is formulated.Smart contract automates this step,and it will be executed only if the conditions specified in the smart contract are met.

  Smart contracts are written in high-level languages(programming languages),such as Solidity or Vyper.Because the smart contract code is stored on the ETH blockchain,anyone can check the application logic of all smart contracts on the network.

  首先调用UniswapV3Factory.getPool方法查看交易对是否已经创建,getPool函数是solidity自动为UniswapV3Factory合约中的状态变量getPool生成的外部函数,getPool的数据类型为:

  contract UniswapV3Factory is IUniswapV3Factory,UniswapV3PoolDeployer,NoDelegateCall{

  ...

  mapping(address=>mapping(address=>mapping(uint24=>address)))public override getPool;

  ...

  }

  使用3个map说明了v3版本使用(tokenA,tokenB,fee)来作为一个交易对的键,即相同代币,不同费率之间的流动池不一样。另外对于给定的tokenA和tokenB,会先将其地址排序,将地址值更小的放在前,这样方便后续交易池的查询和计算。

  再来看UniswapV3Factory创建交易对的过程,实际上它是调用deploy函数完成交易对的创建:
  function deploy(

  address factory,

  address token0,

  address token1,

  uint24 fee,

  int24 tickSpacing

  )internal returns(address pool){

  parameters=Parameters({factory:factory,token0:token0,token1:token1,fee:fee,tickSpacing:tickSpacing});

  pool=address(new UniswapV3Pool{salt:keccak256(abi.encode(token0,token1,fee))}());

  delete parameters;

  }

  这里的fee和tickSpacing是和费率及价格最小间隔相关的设置,这里只关注创建过程,费率和tick的实现后面再来做介绍。

  CREATE2

  创建交易对,就是创建一个新的合约,作为流动池来提供交易功能。创建合约的步骤是:

  pool=address(new UniswapV3Pool{salt:keccak256(abi.encode(token0,token1,fee))}());

  这里先通过keccak256(abi.encode(token0,token1,fee)将token0,token1,fee作为输入,得到一个哈希值,并将其作为salt来创建合约。因为指定了salt,solidity会使用EVM的CREATE2指令来创建合约。使用CREATE2指令的好处是,只要合约的bytecode及salt不变,那么创建出来的地址也将不变。

  关于使用salt创建合约的解释:Salted contract creations/create2

  CREATE2指令的具体解释可以参考:EIP-1014。solidity在0.6.2版本后在语法层面支持了CREATE2.如果使用更低的版本,可以参考Uniswap v2的代码实现同样的功能。

  使用CREATE2的好处是:
  可以在链下计算出已经创建的交易池的地址

  其他合约不必通过UniswapV3Factory中的接口来查询交易池的地址,可以节省gas

  合约地址不会因为reorg而改变

  不需要通过UniswapV3Factory的接口来计算交易池合约地址的方法,可以看这段代码。

  新交易对合约的构造函数中会反向查询UniswapV3Factory中的parameters值来进行初始变量的赋值:

  constructor(){

  int24 _tickSpacing;

  (factory,token0,token1,fee,_tickSpacing)=IUniswapV3PoolDeployer(msg.sender).parameters();

  tickSpacing=_tickSpacing;

  maxLiquidityPerTick=Tick.tickSpacingToMaxLiquidityPerTick(_tickSpacing);

  }

  为什么不直接使用参数传递来对新合约的状态变量赋值呢。这是因为CREATE2会将合约的initcode和salt一起用来计算创建出的合约地址。而initcode是包含contructor code和其参数的,如果合约的constructor函数包含了参数,那么其initcode将因为其传入参数不同而不同。在off-chain计算合约地址时,也需要通过这些参数来查询对应的initcode。为了让合约地址的计算更简单,这里的constructor不包含参数(这样合约的initcode将时唯一的),而是使用动态call的方式来获取其创建参数。

  最后,对创建的交易对合约进行初始化:

  function initialize(uint160 sqrtPriceX96)external override{

  require(slot0.sqrtPriceX96==0,'AI');

  int24 tick=TickMath.getTickAtSqrtRatio(sqrtPriceX96);

  (uint16 cardinality,uint16 cardinalityNext)=observations.initialize(_blockTimestamp());

  slot0=Slot0({

  sqrtPriceX96:sqrtPriceX96,

  tick:tick,

  observationIndex:0,

  observationCardinality:cardinality,

  observationCardinalityNext:cardinalityNext,

  feeProtocol:0,

  unlocked:true

  });

  emit Initialize(sqrtPriceX96,tick);

  }

  初始化主要是设置了交易池的初始价格(注意,此时池子中还没有流动性),以及费率,tick等相关变量的初始化。完成之后一个交易池就创建好了。

相关文章
|
区块链
Defi代币质押持币生息系统技术开发/源代码/质押挖矿dapp
Defi代币质押持币生息系统技术开发/源代码/质押挖矿dapp
|
算法 区块链
Defi+NFT质押流动性挖矿系统开发/LP质押挖矿功能开发解析
Defi+NFT质押流动性挖矿系统开发/LP质押挖矿功能开发解析
|
JavaScript 前端开发 区块链
DAPP代币合约流动性质押分红挖矿系统开发丨技术分析
DAPP代币合约流动性质押分红挖矿系统开发丨技术分析
|
存储 边缘计算 网络协议
关于智能合约DAPP流动性质押挖矿分红系统开发实现技术原理及详情
Web3.0这个名字出现得比区块链更早。但在区块链兴起之前,Web3.0因缺乏解决方案只能停留在概念阶段。随着区块链技术的发展和加密货币投资者的增多,以太坊、Polkadot等区块链生态中涌现出一批与Web3.0相关的项目。因此,区块链技术奠定了Web3.0发展的基础。就整个区块链行业而言,多链并存的格局还会持续很长时间。在这种情况下,不同区块链生态的Web3.0用户有进行交互的需求,跨链技术会在这个过程中发挥重要作用。
关于智能合约DAPP流动性质押挖矿分红系统开发实现技术原理及详情
|
存储 前端开发 JavaScript
浅谈DAPP智能合约流动性质押挖矿分红系统开发技术分析及代码部署
“Web3.0”是一个用户共建、隐私保护、平台开放的生态体系。相比“Web2.0”,“Web3.0”的目标是实现一个更加开放、零信任或是低信任、无许可的价值互联网时代。其生态体系主要由“Web3.0钱包”、“稳定币”、“公链”、“NFT”、“GameFi”、“去中心化存储”、“Dapp”、“DAO”、“DeFi”构成。
浅谈DAPP智能合约流动性质押挖矿分红系统开发技术分析及代码部署
|
机器学习/深度学习 人工智能 安全
PtahDao/ProTradex/Meta2032流动性质押挖矿分红系统开发(NFT质押挖矿开发)丨成熟及源码
 区块链技术由此可以从多方面为企业赋能:提供可靠的共享数据,在各方之间建立信任;消除数据孤岛,即通过去中心化的,在一个网络中共享并支持获许可方访问的账本将数据集成到一个系统中;为数据赋予高度安全性
|
存储 缓存 算法
流动性质押挖矿分红开发源码版,流动性质押挖矿分红系统开发技术详细及分析
共识模块主要由几个组件组成,世代epoch、提案消息缓存服务msgcache、共识消息处理引擎engine、共识消息验证器verifier、提案消息存储服务forest、投票处理器voter、共识活性服务pacemaker、wal存储wal、节点间共识信息同步服务compensator、各模块相互配合实现maxbft流水线共识算法
|
安全 5G
dapp借贷理财挖矿开发案例丨dapp借贷理财挖矿系统开发(开发逻辑及方案)丨dapp借贷理财挖矿系统源码
  Blockchain is a distributed ledger that is open to all.It uses blockchain data structure to verify and store data,and uses cryptography to ensure the security of data transmission and access.It has the characteristics of decentralization,tamper-proof,transparency and openness.
|
5G 区块链 vr&ar
DAPP智能合约流动性质押挖矿分红开发案例版丨DAPP智能合约流动性质押挖矿分红系统开发(开发案例及源码)
The metauniverse is an immersive digital world created by the combination of virtual reality,augmented reality and the Internet.The connotation and key technologies of the metauniverse require further breaking the space-time limit(5G and the Internet of Things),real immersion(VR),and value transmi
|
区块链 索引
DAPP/LP代币智能合约流动性质押挖矿互助公排开发需求丨DAPP/LP代币智能合约流动性质押挖矿互助公排系统开发详细及方案
 以区块链为核心的数字科技可以推动信息技术服务,从而促进数字产业化;元宇宙可以创造和创新更广泛的应用场景,拉动信息消费促进产业数字化。因此,以区块链为核心的Web3.0技术体系推动形成的元宇宙数字生态,将对数字产业化和产业数字化提供有力支撑,为数字经济高质量发展打造新引擎。