Implementación de contrato a partir de contrato

Intento algo como esto:

Niño.sol

pragma solidity ^0.4.6;
contract Child {
  address owner;

  function Child() {
    owner = msg.sender;
  }
}

padre.sol

pragma solidity ^0.4.6;

import "./Child.sol"

contract Parent {

  address owner;


  function Parent(){
    owner = msg.sender;
  }

  function createChild() {
    Child child = new Child()
  }
}

Luego implemento Parent.sol. Puedo encontrar esta transacción en etherscan. Luego llamo a la función createChild(), pero el contrato no se implementa porque no puedo encontrar ninguna transacción nueva.

Entonces la pregunta es, ¿cómo debo hacerlo bien? Gracias.

¿O debería simplemente archivar todas las direcciones de los contratos de niños en el contrato de padres? Entonces el contrato de los padres puede ser muy pesado.

Respuestas (2)

Es posible que no esté viendo el contrato Child porque está en una transacción interna. Mire debajo de la pestaña "Transacción interna" en etherscan (en la página del contrato principal) para verificar.

Si, tienes razón, gracias! Encontré la dirección de mi contrato de niño en la sección de transacciones internas. Pero de todos modos, será muy difícil interactuar con ese contrato. Solo si, como dijo @rob-hitchens, tenemos una variedad de estos contratos en Parent y luego interactuamos con ellos a través de este contrato.

En mi opinión, es un buen comienzo, pero Parent dice algo sobre el niño, por lo que no es útil.

Algunas ideas.

    pragma solidity ^0.4.6;

    contract Child {

      address public owner; // public, so you can see it when you find the child

      function Child() {
        owner = msg.sender;
      }
    }

y ...

pragma solidity ^0.4.6;

import "./Child.sol"

contract Parent {

  address owner;
  address[] public children; // public, list, get a child address at row #
  event LogCreatedChild(address child); // maybe listen for events

  function Parent(){
    owner = msg.sender;
  }

  function createChild() {
    Child child = new Child();
    LogChildCreated(child); // emit an event - another way to monitor this
    children.push(child); // you can use the getter to fetch child addresses
  }
}

Acabo de hacer eso aquí mismo en SE, así que espero no haberte equivocado en la sintaxis.

Espero eso ayude.

Gracias, lo intentaré. Pero, ¿es bueno almacenar niños en Parent? Quiero decir, si tenemos muchas unidades para niños, el contrato de los padres será muy pesado.
Tienes razón al pensar en la escala y el costo. Esa es una consideración importante. Hasta ahora, es un ejemplo muy simple y el costo y el rendimiento del gas deberían ser consistentes. Sería un poco prolijo explicar los detalles. Baste decir que .push() no aumenta de costo a medida que crece el tamaño de la tabla.
¿Podría por favor explicarme? Creamos instancias secundarias y las almacenamos en el contrato principal. Cuando enviamos transacciones, por ejemplo, a algunos de los hijos (cambiamos algún valor en el contrato hijo), ¿costará lo mismo que para Padre con una matriz que almacena 100000 instancias secundarias y para Padre con una matriz que almacena 100 instancias? Entonces, como lo entiendo ahora, en realidad no pagamos por almacenar contratos pesados, pagamos por transacciones, por lo que si la transacción es solo para cambiar algún valor o transferir ether a alguna dirección, esta transacción debería costar lo mismo que otras transacciones simples. ?
Solo pienso en cómo puedo desarrollarlo bien. ¿Es suficiente simplemente eliminar un contrato principal y almacenar allí otros contratos secundarios, o de alguna manera debería usar un nodo en un servidor para implementar por separado nuevos contratos secundarios en la cadena de bloques?
El diseño preciso depende del caso de uso. En lo que respecta a este ejemplo, hasta ahora todo bien en todas sus preguntas, aunque percibo algunas suposiciones ocultas y le aclararía algunas cosas. Este hilo se está haciendo demasiado largo para SE, así que desconectémoslo. Encuentre mi información de contacto en el perfil y no dude en comunicarse.