create(create account)不看后悔

Mark wiens

发布时间:2024-01-12

CREATE2CREATE2 操作码使我们在智能合约部署在以太坊网络之前就能预测合约的地址。

create(create account)不看后悔

 

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

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

创建者地址不会变,但 nonce 可能会随时间而改变,因此用 CREATE 创建的合约地址不好预测CREATE2 如何计算地址CREATE2 的目的是为了让合约地址独立于未来的事件不管未来区块链上发生了什么,你都可以把合约部署在事先计算好的地址上。

用 CREATE2 创建的合约地址由 4 个部分决定:0xFF:一个常数,避免和 CREATE 冲突创建者地址 salt(盐):一个创建者给定的数值待部署合约的字节码(bytecode)  

CREATE2 确保,如果创建者使用 CREATE2 和提供的 salt 部署给定的合约 bytecode,它将存储在 新地址 中如何使用 CREATE2CREATE2 的用法和之前讲的 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 的基础。

免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186