Skip to content

Commit

Permalink
Merge pull request #588 from XdpCs/fix-24-readme
Browse files Browse the repository at this point in the history
docs(24_create/readme.md): fix md's warnings and some content errors
  • Loading branch information
AmazingAng authored Nov 21, 2023
2 parents a259ad7 + 0c468fd commit 1a9cbef
Showing 1 changed file with 21 additions and 14 deletions.
35 changes: 21 additions & 14 deletions 24_Create/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ tags:

# WTF Solidity极简入门: 24. 在合约中创建新合约

我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。
我最近在重新学Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。

推特:[@0xAA_Science](https://twitter.com/0xAA_Science)

Expand All @@ -22,24 +22,27 @@ tags:
在以太坊链上,用户(外部账户,`EOA`)可以创建智能合约,智能合约同样也可以创建新的智能合约。去中心化交易所`uniswap`就是利用工厂合约(`PairFactory`)创建了无数个币对合约(`Pair`)。这一讲,我会用简化版的`uniswap`讲如何通过合约创建合约。

## `create`

有两种方法可以在合约中创建新合约,`create``create2`,这里我们讲`create`,下一讲会介绍`create2`

`create`的用法很简单,就是`new`一个合约,并传入新合约构造函数所需的参数:

```solidity
Contract x = new Contract{value: _value}(params)
```

其中`Contract`是要创建的合约名,`x`是合约对象(地址),如果构造函数是`payable`,可以创建时转入`_value`数量的`ETH``params`是新合约构造函数的参数。

## 极简Uniswap

`Uniswap V2`[核心合约](https://github.com/Uniswap/v2-core/tree/master/contracts)中包含两个合约:

1. UniswapV2Pair: 币对合约,用于管理币对地址、流动性、买卖。
2. UniswapV2Factory: 工厂合约,用于创建新的币对,并管理币对地址。

下面我们用`create`方法实现一个极简版的`Uniswap``Pair`币对合约负责管理币对地址,`PairFactory`工厂合约用于创建新的币对,并管理币对地址。

### `Pair`合约
### `Pair`合约

```solidity
contract Pair{
Expand All @@ -59,6 +62,7 @@ contract Pair{
}
}
```

`Pair`合约很简单,包含3个状态变量:`factory``token0``token1`

构造函数`constructor`在部署时将`factory`赋值为工厂合约地址。`initialize`函数会由工厂合约在部署完成后手动调用以初始化代币地址,将`token0``token1`更新为币对中两种代币的地址。
Expand All @@ -68,6 +72,7 @@ contract Pair{
> ****:因为`uniswap`使用的是`create2`创建合约,生成的合约地址可以实现预测,更多详情请阅读[第25讲](https://github.com/AmazingAng/WTF-Solidity/blob/main/25_Create2/readme.md)
### `PairFactory`

```solidity
contract PairFactory{
mapping(address => mapping(address => address)) public getPair; // 通过两个代币地址查Pair地址
Expand All @@ -86,32 +91,34 @@ contract PairFactory{
}
}
```

工厂合约(`PairFactory`)有两个状态变量`getPair`是两个代币地址到币对地址的`map`,方便根据代币找到币对地址;`allPairs`是币对地址的数组,存储了所有代币地址。

`PairFactory`合约只有一个`createPair`函数,根据输入的两个代币地址`tokenA``tokenB`来创建新的`Pair`合约。其中

```solidity
Pair pair = new Pair();
Pair pair = new Pair();
```

就是创建合约的代码,非常简单。大家可以部署好`PairFactory`合约,然后用下面两个地址作为参数调用`createPair`,看看创建的币对地址是什么:
```

```text
WBNB地址: 0x2c44b726ADF1963cA47Af88B284C06f30380fC78
BSC链上的PEOPLE地址:
0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
BSC链上的PEOPLE地址: 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
```

### 在remix上验证

1.使用`WBNB``PEOPLE`的地址作为参数调用`createPair`,得到`Pair`合约地址:0xD3e2008b4Da2cD6DEAF73471590fF30C86778A48
1. 使用`WBNB``PEOPLE`的地址作为参数调用`createPair`,得到`Pair`合约地址:0xD3e2008b4Da2cD6DEAF73471590fF30C86778A48

![](./img/24-1.png)
![24-1](./img/24-1.png)
2. 查看`Pair`合约变量

2.查看`Pair`合约变量
![24-2](./img/24-2.png)
3. Debug查看`create`操作码

![](./img/24-2.png)

3.Debug查看`create`操作码

![](./img/24-3.png)
![24-3](./img/24-3.png)

## 总结

这一讲,我们用极简`Uniswap`的例子介绍了如何使用`create`方法再合约里创建合约,下一讲我们将介绍如何使用`create2`方法来实现极简`Uniswap`

0 comments on commit 1a9cbef

Please sign in to comment.