工厂合约模式factory / 学习智能合约#45

从智能合约中创建另一个智能合约,就像一个工厂批量制造出产品一样。工厂模式的想法是拥有一个合约(工厂),该合约将承担创建其他合约的任务。

工厂合约创建子合约有两种方法:new方法和create2方法。

计算合约地址

//使用new关键字来创建子合约
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract Child{
     uint data;
     constructor(uint _data){
        data = _data;
     }
}

contract Factory {
      Child[] public children;
      function createChild(uint data) public {
         Child child = new Child(data);
         children.push(child);
      }
}


//使用create2方法创建子合约
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract Child{
     uint data;
     constructor(uint _data){
        data = _data;
     }
}

contract Factory {
      Child[] public children;
      function createChild(uint data) public {
        //给bytecode变量赋值"Child"合约的创建字节码
        bytes memory bytecode = type(Child).creationCode;
        //constructor
        bytes memory bytecode2 = abi.encodePacked(bytecode, abi.encode(data));

        //将msg.sender打包后创建哈希
        bytes32 salt = keccak256(abi.encodePacked(msg.sender));
        //内联汇编
        assembly {
            //通过create2方法布署合约,并且加盐,返回地址
          Child child := create2(0, add(bytecode2, 32), mload(bytecode2), salt)
        }
        children.push(child);
      }
}
H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now
Ecency