Solidity极简入门|第二十五讲:Create2

CREATE2

CREATE2 操作码使我们在智能合约部署在以太坊网络之前就能预测合约的地址。Uniswap 创建 Pair 合约用的就是 CREATE2。这一讲,我将介绍 CREATE2 的用法。

CREATE 如何计算地址

智能合约可以由其他合约和普通账户利用 CREATE 操作码创建。在这两种情况下,新合约的地址都以相同的方式计算:创建者的地址和 nonce(该地址发送交易的总数) 的哈希。

68cb5fadf7424aa1f706e5a87a3cba7a.jpeg

创建者地址不会变,但 nonce 可能会随时间而改变,因此用 CREATE 创建的合约地址不好预测。

CREATE2 如何计算地址

CREATE2 的目的是为了让合约地址独立于未来的事件。不管未来区块链上发生了什么,你都可以把合约部署在事先计算好的地址上。用 CREATE2 创建的合约地址由 4 个部分决定:

0xFF:一个常数,避免和 CREATE 冲突

创建者地址 

salt(盐):一个创建者给定的数值

待部署合约的字节码(bytecode)  

78f0d633e0fc42e5be1d28f00cb3123c.jpeg

CREATE2 确保,如果创建者使用 CREATE2 和提供的 salt 部署给定的合约 bytecode,它将存储在 新地址 中。

如何使用 CREATE2

CREATE2 的用法和之前讲的 Create 类似,同样是 new 一个合约,并传入新合约构造函数所需的参数,只不过要多传一个 salt 参数:

23960675ee4a142d6e66c0934440000f.jpeg

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

极简 Uniswap2

跟上一讲类似,我们用 Create2 来实现极简 Uniswap。

Pair  

6f823bc5c9ccee02bd25d1d83b109a66.jpeg

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

构造函数 constructor 在部署时将 factory 赋值为工厂合约地址。initialize 函数会在 Pair 合约创建的时候被工厂合约调用一次,将 token0 和 token1 更新为币对中两种Token的地址。

PairFactory2  

69dc6b5174459219221f74fa205d0089.jpeg

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

PairFactory2 合约只有一个 createPair2 函数,使用 CREATE2 根据输入的两个 Token 地址 tokenA 和 tokenB 来创建新的 Pair 合约。其中

4c3d09283917fa5cb8cb9a33466d0749.jpeg

就是利用 CREATE2 创建合约的代码,非常简单,而 salt 为 token1 和 token2 的 hash:  

30b05624ca3ff09e71b0fb5bd3d1b188.jpeg

事先计算 Pair 地址  

23856b0f49d7a0b2a3d2016e965eda0f.jpeg

我们写了一个 calculateAddr 函数来事先计算 tokenA 和 tokenB 将会生成的 Pair 地址。通过它,我们可以验证我们事先计算的地址和实际地址是否相同。

大家可以部署好 PairFactory2 合约,然后用下面两个地址作为参数调用 createPair2,看看创建的币对地址是什么,是否与事先计算的地址一样:

b51699b738ab2828e8799db4daa10b4a.jpeg

总结

这一讲,我们介绍了 CREATE2 操作码的原理,使用方法,并用它完成了极简版的 Uniswap 并提前计算币对合约地址。CREATE2 让我们可以在部署合约前确定它的合约地址,这也反事实系统和很多 layer2 的基础。

aad5721c78cbf14fe6e3b4c64ee28f56.jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值