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
操作码,将合约部署至特定地址。
9.23 在Conflux中使用OppenZeppelin的Clones, Create2合约
OppenZeppelin 提供了Clones
合约与Create2
合约帮助开发者部署minimal proxy
合约或使用create2字节码部署合约。对于习惯使用OppenZeppelin的开发者,conflux-contracts中也提供了对应的代码,对合约地址计算进行了适配。代码见Clones.sol, Create2.sol。
No Comments