创建合约的几个方法:
- 外部部署(Remix/Hardhat/Truffle)Web.js
- 合约使用New
- 最小代理合约(克隆)
https://eips.ethereum.org/EIPS/eip-1167
https://github.com/optionality/clone-factor y - Create2
C c = new C{salt: _salt}();
分析一下:
外部部署比较好理解,直接部署就好了 。 使用new的时候可以指定颜值
function createContract(uint _salt) public returns (address) {
C c = new C{salt: keccak256(abi.encode(_salt))}();
return address(c);
}
此时合约的地址就是确定好的,相当于可以提前预测合约的地址,跟Create2 就类似了。
获取合约的地址 :
function getAddress(uint _salt) public view returns (address) {
bytes memory bytecode = type(C).creationCode;
// if constructor
// bytecode = abi.encodePacked(bytecode, abi.encode(x));
bytes32 hash = keccak256(
abi.encodePacked(bytes1(0xff), address(this),
keccak256(abi.encode(_salt)), keccak256(bytecode))
);
// NOTE: cast last 20 bytes of hash to address
return address(uint160(uint(hash)));
}
CREATE2
允许提前计算要部署的智能合约的地址,计算公式如下:
keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]