Создание независимого контракта из другого контракта

Я разработал контракт, и я бы сделал «инициаторский» контракт, с которым можно связаться с информацией для создания первого контракта и небольшим количеством эфириума (я знаю, это не супер, потому что любой может декомпилировать контракт инициатора с etherscan на optcode и найти перекомпилированный код для первого контракта, но более простой у инициатора).

Все хорошо, кроме создания самостоятельного контракта (самостоятельное исполнение, пожизненное (в случае самосуда инициатора его дети не умрут)).

И как ответить более чем установить переменную хранилища с первым адресом контракта.

Ответы (1)

Срок для инициатора заводской. Довольно хороший пример от 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);
  }