create 和 create2
有两种方法可以在合约中创建新合约,create 和 create2,这里我们讲 create,下一讲会介绍 create2。
create 的用法很简单,就是 new 一个合约,并传入新合约构造函数所需的参数:
其中 Contract 是要创建的合约名,x 是合约对象(地址),如果构造函数是 payable,可以创建时转入_value 数量的 ETH,params 是新合约构造函数的参数。
极简 Uniswap
Uniswap V2核心合约中包含两个合约:
UniswapV2Pair: 币对合约,用于管理币对地址、流动性、买卖。
UniswapV2Factory: 工厂合约,用于创建新的币对,并管理币对地址。
下面我们用 create 方法实现一个极简版的 Uniswap:Pair 币对合约负责管理币对地址,PairFactory 工厂合约用于创建新的币对,并管理币对地址。
Pair 合约很简单,包含 3 个状态变量:factory,token0 和 token1。
构造函数 constructor 在部署时将 factory 赋值为工厂合约地址。initialize 函数会在 Pair 合约创建的时候被工厂合约调用一次,将 token0 和 token1 更新为币对中两种Token的地址。
提问:为什么 uniswap 不在 constructor 中将 token0 和 token1 地址更新好?
PairFactory
工厂合约(PairFactory)有两个状态变量 getPair 是两个 Token 地址到币对地址的 map,方便根据 Token 找到币对地址;allPairs 是币对地址的数组,存储了所有 Token 地址。
PairFactory 合约只有一个 createPair 函数,根据输入的两个 Token 地址 tokenA 和 tokenB 来创建新的 Pair 合约。其中
就是创建合约的代码,非常简单。大家可以部署好 PairFactory 合约,然后用下面两个地址作为参数调用 createPair,看看创建的币对地址是什么:
总结
这一讲,我们用极简 Uniswap 的例子介绍了如何使用 create 方法再合约里创建合约,下一讲我们将介绍如何使用 create2 方法来实现极简 Uniswap。