
Uniswap V2 交易所部署详解
在DeFi世界中,Dex(去中心化交易所)是最核心的一块,Uniswap是整个Dex的龙头,SushiSwap,PancakeSwap 等都是参考,甚至完全fork了Uniswap的整个产品逻辑和代码,也因此好多人也想部署快速部署一个属于自己的Uniswap,个人觉得也是很有必要的,通过自己从零搭建,一步一步完成,在这个过程可以清楚知道Uniswap整个项目工程的结构和产品逻辑,将来也能站在巨人的肩膀上,开发出自己的DeFi乐高! 前置说明:本次部署是参考Uniswap V2的线上版本,同时结合催眠大师的教程总结来的。本次部署的一些前置工作还需要自己提前准备,比如github账号,钱包,测试网代币水龙头,准备部署账户等部署流程步骤:从浏览器中下载合约源码准备部署账户使用remix编译部署合约部署前端代码安装依赖库修改路由地址将代码部署到Github Pages生成自定义的token自定义token导入Uniswap交易所正文 从浏览器中下载合约源码 这次用的是线上版本 工厂合约 路由合约2 路由合约1是可选的,部署的流程是先部署工厂合约,然后将工厂合约的地址复制给路由合约2的构造...
DeFi交易龙头之Uniswap:V2(核心合约-配对合约)
前面介绍了工厂合约,我们知道配对合约其实是需要工厂合约来进行部署的。从代码上来看,配对合约是继承ERC20合约,那么配对合约实际上就是一个遵守Erc20合约的token. 代码解析类型方法增强从上图看,首先是讲SafeMath和UQ112*112 的库方法给到了对应类型上。为什么要赋予uint224呢,这是因为在solidity中没有非整形的类型,但是实际上token的数量会出现小数位,使用库UQ112**112去模拟浮点数。 2. 常量16行中定义了一个最小流动性,在白皮书的3.4中初始化流动性代币供应这节会讲到,结论就是通过保证最小数量的流动性份额,会大大增加上述攻击的成本。具体的原理我会单独在开一篇章节进行讲解。 18行的selector的常量值是transfer(address, uint256)字符串哈希值的前4个字节,这个用于直接使用call方法调用token的转账方法。 22行工厂地址:因为pair合约是通过工厂合约进行部署的,所有会有一个变量专门去存放工厂合约地址。 23到27行主要是token地址和储备量地址相关。主要是存放两个token的地址,便于调用。储备量...
cypto is the future!

Uniswap V2 交易所部署详解
在DeFi世界中,Dex(去中心化交易所)是最核心的一块,Uniswap是整个Dex的龙头,SushiSwap,PancakeSwap 等都是参考,甚至完全fork了Uniswap的整个产品逻辑和代码,也因此好多人也想部署快速部署一个属于自己的Uniswap,个人觉得也是很有必要的,通过自己从零搭建,一步一步完成,在这个过程可以清楚知道Uniswap整个项目工程的结构和产品逻辑,将来也能站在巨人的肩膀上,开发出自己的DeFi乐高! 前置说明:本次部署是参考Uniswap V2的线上版本,同时结合催眠大师的教程总结来的。本次部署的一些前置工作还需要自己提前准备,比如github账号,钱包,测试网代币水龙头,准备部署账户等部署流程步骤:从浏览器中下载合约源码准备部署账户使用remix编译部署合约部署前端代码安装依赖库修改路由地址将代码部署到Github Pages生成自定义的token自定义token导入Uniswap交易所正文 从浏览器中下载合约源码 这次用的是线上版本 工厂合约 路由合约2 路由合约1是可选的,部署的流程是先部署工厂合约,然后将工厂合约的地址复制给路由合约2的构造...
DeFi交易龙头之Uniswap:V2(核心合约-配对合约)
前面介绍了工厂合约,我们知道配对合约其实是需要工厂合约来进行部署的。从代码上来看,配对合约是继承ERC20合约,那么配对合约实际上就是一个遵守Erc20合约的token. 代码解析类型方法增强从上图看,首先是讲SafeMath和UQ112*112 的库方法给到了对应类型上。为什么要赋予uint224呢,这是因为在solidity中没有非整形的类型,但是实际上token的数量会出现小数位,使用库UQ112**112去模拟浮点数。 2. 常量16行中定义了一个最小流动性,在白皮书的3.4中初始化流动性代币供应这节会讲到,结论就是通过保证最小数量的流动性份额,会大大增加上述攻击的成本。具体的原理我会单独在开一篇章节进行讲解。 18行的selector的常量值是transfer(address, uint256)字符串哈希值的前4个字节,这个用于直接使用call方法调用token的转账方法。 22行工厂地址:因为pair合约是通过工厂合约进行部署的,所有会有一个变量专门去存放工厂合约地址。 23到27行主要是token地址和储备量地址相关。主要是存放两个token的地址,便于调用。储备量...
cypto is the future!

Subscribe to cyptoJune

Subscribe to cyptoJune
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
在DeFi赛道中,Dex是整个DeFi乐高极其关键的模组,Uniswap 又是整个Dex领域的龙头,而SushiSwap,PancakeSwap等也是fork了Uniswap的开源代码。它的创新之处就是舍弃了传统订单薄的撮合方式,采用了流动性+恒定乘积共识算法来为不同资产和交易对提供及时报价和兑换服务。
接下来的系列文章,我会分成系列文章来刨析UniswapV2的产品架构和合约代码,提供诸如手续费的手续以及分配机制的实现,注入流动性算出返回LP Token等。
系列文章参考了诸如youtube -崔棉大师 课程--去中心化交易所等13节课程讲解以及youtube -@mrblock 區塊先生 等诸多up主的无私讲解。
Uniswap V2的产品模块拆分了很多项目模块,主要包括以下:
uniswap-interface
uniswap-v2-sdk
uniswap-sdk-core
uniswap-info
uniswap-v2-subgraph
uniswap-v2-core
uniswap-v2-periphery
uniswap-lib
前三个是前端App项目,提供交易的模块。
uniswap-interface项目模块是放置前端页面以及展示应用的功能。
Uniswap-v2-sdk和Uniswap-sdk-core是作为SDK存在的。uniswap-interface会引用v2-sdk和sdk-core,通过uniswap/v2-sdk和uniswap/sdk-core的方式引入到需要使用的TS文件中。
Uniswap-inerface最新代码是跟线上是同步的,即是集成了v3版本。如果只想部署v2版本前端,可以找出历史版本check出来进行部署。
Uniswap-info则是Uniswap Analytics 项目,业务数据主要是从 Subgraph 读取。uniswap-v2-subgraph 则是 Subgraph 项目。
最后三个则是合约项目了,uniswap-v2-core 就是核心合约的实现; uniswap-v2-periphery 则提供了和 UniswapV2 进行交互的外围合约,主要就是路由合约;uniswap-lib 则封装了一些工具合约。
本篇文章我们先讲解uniswap-v2-core核心合约的实现。
UniswapV2Factory.sol:工厂合约
UniswapV2Pair.sol:配对合约
UniswapV2ERC20.sol:LP Token 合约
配对合约管理着流动性资金池,不同币对有着不同的配对合约实例,比如USDT-WETH这一币对,就对应一个配对合约的实例,DAI-WETH 又对应另一个配对合约实例。
LP Token合约则是用户往资金池注入流动性的一种凭证,也成为流动性代币。当用户往某个币对合约里转入两种token,即是添加流动性,那么就可以得到配对合约返回的LP Token,享受手续费分成收益。
工厂合约则是用来部署配对合约的,通过工厂合约的createPair()函数来创建新的配对合约实例。
三个合约的关系:

对应合约代码关系如下:


工厂合约是UniswapV2中的核心代码,所有的Pair合约都是通过工厂合约来进行部署的。工厂合约部分主要是两个功能,一个是创建配对方法,另一个是收税地址和设置收税地址权限地址。
创建配对方法 createPair()

该方法功能是创建一组新的交易对,传入的参数是;两个token的address,该方法比较关键的是create2,它是采用了内联汇编。那么为什么要采用create2方法来新建合约实例呢,主要是可以在部署合约之前可以预先计算出合约的部署地址,从而使这个合约地址可预测,这样便于Router合约不进行任何调用,就可以计算得到Pair合约的地址。
bytes memory bytecode = type(UniswapV2Pair).creationCode;
//将token0和token1打包后创建哈希
bytes32 salt = keccak256(abi.encodePacked(token0, token1));
// 内联汇编
// solium-disable-next-line
assembly {
//通过create2方法布署合约,并且加盐,返回地址到pair变量
pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
}
上面这三行代码就是提前计算pair合约地址,第一行是根据UniswapV2Pair合约代码的创建字节码createCode.第二行是根据两个代币地址计算出一个盐值。紧接着用 assembly 关键字包起一段内联汇编代码,通过调用create2操作码来创建新合约。
收税地址和设置收税地址权限地址
设置平台手续费收取地址
权限控制人合约可以设定平台手续费是否收取以及收取地址。

平台手续费收取权限控制
原权限控制人,可以另外指派一个新的address来作为新的权限控制人。

以上就是工厂合约的全部功能了,在实际部署合约的时候,只需要部署工厂合约就可以了。因为配对合约是被引用的,因此不需要再部署配对合约。
下篇分析配对合约,敬请期待!
在DeFi赛道中,Dex是整个DeFi乐高极其关键的模组,Uniswap 又是整个Dex领域的龙头,而SushiSwap,PancakeSwap等也是fork了Uniswap的开源代码。它的创新之处就是舍弃了传统订单薄的撮合方式,采用了流动性+恒定乘积共识算法来为不同资产和交易对提供及时报价和兑换服务。
接下来的系列文章,我会分成系列文章来刨析UniswapV2的产品架构和合约代码,提供诸如手续费的手续以及分配机制的实现,注入流动性算出返回LP Token等。
系列文章参考了诸如youtube -崔棉大师 课程--去中心化交易所等13节课程讲解以及youtube -@mrblock 區塊先生 等诸多up主的无私讲解。
Uniswap V2的产品模块拆分了很多项目模块,主要包括以下:
uniswap-interface
uniswap-v2-sdk
uniswap-sdk-core
uniswap-info
uniswap-v2-subgraph
uniswap-v2-core
uniswap-v2-periphery
uniswap-lib
前三个是前端App项目,提供交易的模块。
uniswap-interface项目模块是放置前端页面以及展示应用的功能。
Uniswap-v2-sdk和Uniswap-sdk-core是作为SDK存在的。uniswap-interface会引用v2-sdk和sdk-core,通过uniswap/v2-sdk和uniswap/sdk-core的方式引入到需要使用的TS文件中。
Uniswap-inerface最新代码是跟线上是同步的,即是集成了v3版本。如果只想部署v2版本前端,可以找出历史版本check出来进行部署。
Uniswap-info则是Uniswap Analytics 项目,业务数据主要是从 Subgraph 读取。uniswap-v2-subgraph 则是 Subgraph 项目。
最后三个则是合约项目了,uniswap-v2-core 就是核心合约的实现; uniswap-v2-periphery 则提供了和 UniswapV2 进行交互的外围合约,主要就是路由合约;uniswap-lib 则封装了一些工具合约。
本篇文章我们先讲解uniswap-v2-core核心合约的实现。
UniswapV2Factory.sol:工厂合约
UniswapV2Pair.sol:配对合约
UniswapV2ERC20.sol:LP Token 合约
配对合约管理着流动性资金池,不同币对有着不同的配对合约实例,比如USDT-WETH这一币对,就对应一个配对合约的实例,DAI-WETH 又对应另一个配对合约实例。
LP Token合约则是用户往资金池注入流动性的一种凭证,也成为流动性代币。当用户往某个币对合约里转入两种token,即是添加流动性,那么就可以得到配对合约返回的LP Token,享受手续费分成收益。
工厂合约则是用来部署配对合约的,通过工厂合约的createPair()函数来创建新的配对合约实例。
三个合约的关系:

对应合约代码关系如下:


工厂合约是UniswapV2中的核心代码,所有的Pair合约都是通过工厂合约来进行部署的。工厂合约部分主要是两个功能,一个是创建配对方法,另一个是收税地址和设置收税地址权限地址。
创建配对方法 createPair()

该方法功能是创建一组新的交易对,传入的参数是;两个token的address,该方法比较关键的是create2,它是采用了内联汇编。那么为什么要采用create2方法来新建合约实例呢,主要是可以在部署合约之前可以预先计算出合约的部署地址,从而使这个合约地址可预测,这样便于Router合约不进行任何调用,就可以计算得到Pair合约的地址。
bytes memory bytecode = type(UniswapV2Pair).creationCode;
//将token0和token1打包后创建哈希
bytes32 salt = keccak256(abi.encodePacked(token0, token1));
// 内联汇编
// solium-disable-next-line
assembly {
//通过create2方法布署合约,并且加盐,返回地址到pair变量
pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
}
上面这三行代码就是提前计算pair合约地址,第一行是根据UniswapV2Pair合约代码的创建字节码createCode.第二行是根据两个代币地址计算出一个盐值。紧接着用 assembly 关键字包起一段内联汇编代码,通过调用create2操作码来创建新合约。
收税地址和设置收税地址权限地址
设置平台手续费收取地址
权限控制人合约可以设定平台手续费是否收取以及收取地址。

平台手续费收取权限控制
原权限控制人,可以另外指派一个新的address来作为新的权限控制人。

以上就是工厂合约的全部功能了,在实际部署合约的时候,只需要部署工厂合约就可以了。因为配对合约是被引用的,因此不需要再部署配对合约。
下篇分析配对合约,敬请期待!
No activity yet