Skip to content

Latest commit

 

History

History
28 lines (23 loc) · 1.85 KB

File metadata and controls

28 lines (23 loc) · 1.85 KB

102-25 CREATE2

CREATE2

CREATE2 操作码使我们在智能合约部署在以太坊网络之前就能预测合约的地址。Uniswap创建Pair合约用的就是CREATE2而不是CREATE。

CREATE如何计算地址

智能合约可以由其他合约和普通账户利用CREATE操作码创建。 在这两种情况下,新合约的地址都以相同的方式计算:创建者的地址(通常为部署的钱包地址或者合约地址)和nonce的哈希
创建者地址不会变,但nonce可能会随时间而改变,因此用CREATE创建的合约地址不好预测。

CREATE2如何计算地址

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

  • 0xFF:一个常数,避免和CREATE冲突
  • CreatorAddress: 调用 CREATE2 的当前合约(创建合约)地址。
  • salt(盐):一个创建者指定的bytes32类型的值,它的主要目的是用来影响新创建的合约的地址。
  • initcode: 新合约的初始字节码(合约的Creation Code和构造函数的参数)。

使用CREATE2创建合约地址举例如下:

新地址 = hash("0xFF",创建者地址, salt, initcode)

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

如何使用CREATE2

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

Contract x = new Contract{salt: _salt, value: _value}(params)

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