从智能合约中创建另一个智能合约,就像一个工厂批量制造出产品一样。工厂模式的想法是拥有一个合约(工厂),该合约将承担创建其他合约的任务。
工厂合约创建子合约有两种方法:new方法和create2方法。
//使用new关键字来创建子合约// SPDX-License-Identifier: GPL-3.0pragma 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.0pragma 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); }}