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

22-08-26 09:30
阅读本文需 8 分钟
总结 AI 总结
看总结 收起
原文标题:《 Solidity 极简入门: 25. Create2 》
原文作者:0xAA   


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


所有代码和教程开源在 github:github.com/AmazingAng/WTFSolidity


CREATE2


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


CREATE 如何计算地址


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



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


CREATE2 如何计算地址


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


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

创建者地址 

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

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



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


如何使用 CREATE2


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



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


极简 Uniswap2


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


Pair  



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


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


PairFactory2  



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


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



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

  


事先计算 Pair 地址  



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


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



总结


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


原文链接


欢迎加入律动 BlockBeats 官方社群:

Telegram 订阅群:https://t.me/theblockbeats

Telegram 交流群:https://t.me/BlockBeats_App

Twitter 官方账号:https://twitter.com/BlockBeatsAsia

举报 纠错/举报
选择文库
新增文库
取消
完成
新增文库
仅自己可见
公开
保存
纠错/举报
提交