【问题标题】: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"){}