Я разработал контракт, и я бы сделал «инициаторский» контракт, с которым можно связаться с информацией для создания первого контракта и небольшим количеством эфириума (я знаю, это не супер, потому что любой может декомпилировать контракт инициатора с etherscan на optcode и найти перекомпилированный код для первого контракта, но более простой у инициатора).
Все хорошо, кроме создания самостоятельного контракта (самостоятельное исполнение, пожизненное (в случае самосуда инициатора его дети не умрут)).
И как ответить более чем установить переменную хранилища с первым адресом контракта.
Срок для инициатора заводской. Довольно хороший пример от Hudson Jameson — Factory.sol , здесь я приведу немного модифицированную версию.
contract Factory {
bytes32[] public Names;
address[] public newContracts;
function createContract (bytes32 name) public {
address newContract = new Contract(name);
newContracts.push(newContract);
}
function getName (uint i) public {
Contract con = Contract(newContracts[i]);
Names[i] = con.Name();
}
}
contract Contract {
bytes32 public Name;
function Contract (bytes32 name) {
Name = name;
}
}
Чтобы создать новый экземпляр Contract
вашего вызова Factory.createContract("MyName")
.
Поскольку транзакция не может вернуть значение, общий шаблон заключается в создании события, когда вы хотите вернуть несколько значений.
Например, если вы хотите сообщить новый адрес и название контракта, вы можете сделать что-то вроде этого:
contract Factory {
...
// Declare event
event ContractCreated(address _contract, bytes32 _name, uint _index);
function createContract (bytes32 name) public {
address newContract = new Contract(name);
newContracts.push(newContract);
// Generate event on success
ContractCreated(newContract, name, newContracts.length - 1);
}