创建合约的几个方法:

  1. 外部部署(Remix/Hardhat/Truffle)Web.js
  2. 合约使用New
  3. 最小代理合约(克隆) 
    https://eips.ethereum.org/EIPS/eip-1167  
    https://github.com/optionality/clone-factor y
  4. 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:]

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐