You are viewing a single comment's thread from:

RE: Solidity开发指南

in #starnote3 days ago

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

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

计算合约地址

//使用new关键字来创建子合约
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

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方法创建子合约, uniswap用的此方法
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

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);
  }
}