Skip to main content

Week12 Contract address

9.20 Conflux 中 create2 地址的计算

与以太坊相同,Conflux 支持在合约中以 create2 部署合约至指定地址。Conflux 中由 create2 部署的合约地址计算方式与以太坊中大体相同,不同点在于Conflux会修改地址的首位以标识地址的类型。下面的代码描述了合约的hex地址具体的计算方式:

# 也可以使用 Web3.py
# from web3 import Web3
from conflux_web3 import Web3

# 尽量保证salt为bytes32,以避免编码方式带来的计算结果不匹配
def compute_address_using_salt(salt: bytes, bytecode_hash: bytes, deployer: HexAddress):
    core_part = Web3.solidityKeccak(
        ["bytes1", "address", "bytes32", "bytes32"],
        ["0xff", deployer, salt, bytecode_hash]
    )
    return "0x8"+ core_part.hex()[-39:]

9.21 Conflux 中合约部署地址的计算

Conflux 中合约部署地址的计算(非create2)与以太坊有较大不同。在以太坊中,合约部署的地址与部署者地址与nonce相关,合约的字节码不会对部署的地址造成影响。但在Conflux中,合约的字节码也会影响部署的地址。其计算方式与create2类似,下面的代码描述了合约的hex地址具体的计算方式:

# 也可以使用 Web3.py
# from web3 import Web3
from conflux_web3 import Web3

def compute_address_using_nonce(nonce: int, bytecode_hash: bytes, deployer: HexAddress):
    core_part = Web3.solidityKeccak(
        ["bytes1", "address", "bytes32", "bytes32"],
        ["0x00", deployer, nonce.to_bytes(32, "little"), bytecode_hash]
    )
    return "0x8"+ core_part.hex()[-39:]

9.22 Create2Factory 合约

Conflux 在 CIP-31 中引入了 Create2Factory 合约。该合约hex地址为0x8a3a92281df6497105513b18543fd3b60c778e40,借助该合约,开发者能够方便地调用create2操作码,将合约部署至特定地址。

可以在ConfluxScan中查看该合约:主网测试网

9.23 在Conflux中使用OppenZeppelin的Clones, Create2合约

OppenZeppelin 提供了Clones合约与Create2合约帮助开发者部署minimal proxy合约或使用create2字节码部署合约。对于习惯使用OppenZeppelin的开发者,conflux-contracts中也提供了对应的代码,对合约地址计算进行了适配。代码见Clones.sol, Create2.sol