【问题标题】:Can smart contracts deploy other smart contracts?智能合约可以部署其他智能合约吗?
【发布时间】:2022-12-06 07:05:35
【问题描述】:

如果智能合约有合约的编译字节码,可以先部署后续合约吗?

根据 Ethereum.org: “要部署智能合约,您只需发送包含智能合约编译代码的以太坊交易,而无需指定任何收件人。”

我寻找如何通过智能合约发送交易,我能找到的最接近的是转移 ETH 的例子......

    _to.transfer(msg.value);
  
    bool sent = _to.send(msg.value);
   
    (bool sent, bytes memory data) = _to.call{value: msg.value}("");
   

【问题讨论】:

    标签: blockchain ethereum solidity smartcontracts


    【解决方案1】:

    要使智能合约部署另一个智能合约,您可以使用 new 关键字来完成

    contract UserMessage {
      string message;
      constructor(string memory message){
         message = _message;
      }
    }
    
    contract DeployUserMessage {
      mapping(address => address) userToContract;
      
      function Deploy(string memory message) public {
        address contractAddress = new UserMessage(message);
        userToContract[msg.sender] = contractAddress;
      }
    }
    

    我认为这个例子很清楚,但如果你愿意,请查看文档https://docs.soliditylang.org/en/v0.8.9/contracts.html#creating-contracts

    【讨论】:

      【解决方案2】:

      是的,它可以,它被称为工厂模式合约

      contract Child {
          string public name;
          string public gender;
      
          constructor(string memory _name, string memory _gender) {
              name = _name;
              gender = _gender;
          }
      }
      
      contract Parent {
      
          Child public childContract; 
      
          function createChild(string memory _name, string memory _gender) public returns(Child) {
             childContract = new Child(_name, _gender); // creating new contract inside another parent contract
             return childContract;
          }
      }
      

      新的关键字用于在另一个合约函数中创建合约。

      如果是应付合同,则:

      contract Child {
          string public name;
          string public gender;
      
          constructor(string memory _name, string memory _gender) payable {
              name = _name;
              gender = _gender;
          }
      }
      
      contract Parent{
      
          Child public childContract; 
      
          function createChild(string memory _name, string memory _gender) public payable returns(Child) {
      require(msg.value == 0.005 ether)
             childContract = new Child{value: msg.value}(_name, _gender); // creating new contract inside another parent contract
             return childContract;
          }
      }
      

      【讨论】:

        【解决方案3】:

        另一种方法是在继承时调用父级的构造函数。例如,假设您有“姓名”合同

        contract Name {
            string public name;
        
            constructor(string memory _name) {
                name = _name;
            }
        }
        

        现在我的基本合同应该继承自“名称”合同

        // I deployed a new Name contract
        contract Base is Name("Ronaldo"){}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-05
          • 2018-09-23
          • 1970-01-01
          • 2021-11-15
          • 2021-06-17
          • 2023-01-25
          • 1970-01-01
          • 2022-08-04
          相关资源
          最近更新 更多