Vertrag aus Vertrag bereitstellen

Ich versuche so etwas:

Kind.sol

pragma solidity ^0.4.6;
contract Child {
  address owner;

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

Parent.sol

pragma solidity ^0.4.6;

import "./Child.sol"

contract Parent {

  address owner;


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

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

Dann stelle ich Parent.sol bereit. Ich kann diese Transaktion auf Etherscan finden. Dann rufe ich die Funktion createChild() auf, aber der Vertrag wird nicht bereitgestellt, weil ich keine neuen Transaktionen finden kann.

Die Frage ist also, wie mache ich es richtig. Vielen Dank.

Oder soll ich einfach alle Adressen der Child-Verträge im Parent-Vertrag archivieren? Dann kann der Elternvertrag wirklich schwer sein.

Antworten (2)

Es ist möglich, dass Sie den untergeordneten Vertrag nicht sehen, weil er sich in einer internen Transaktion befindet. Sehen Sie unter der Registerkarte „Interne Transaktion“ auf Etherscan (auf der Seite des übergeordneten Vertrags) nach, um dies zu überprüfen.

Ja, du hast Recht, danke! Ich habe die Vertragsadresse meines Kindes im Bereich für interne Transaktionen gefunden. Aber wie auch immer, es wird wirklich schwierig sein, mit diesem Vertrag zu interagieren. Nur wenn wir, wie @rob-hitchens sagte, eine Reihe dieser Verträge in Parent haben und dann über diesen Vertrag mit ihnen interagieren.

Meiner Meinung nach ist das ein guter Anfang, aber Eltern sagt nichts über das Kind aus, also ist es nicht nützlich.

Einige Ideen.

    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;
      }
    }

und ...

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
  }
}

Ich habe das gerade hier in SE gemacht, also hoffe ich, dass ich Ihnen nicht die Syntax vermasselt habe.

Ich hoffe es hilft.

Danke, ich werde es versuchen. Aber ist es gut, Kinder in Parent zu speichern? Ich meine, wenn wir viele untergeordnete Einheiten haben, wird der Elternvertrag wirklich schwer sein.
Sie haben Recht, wenn Sie über Umfang und Kosten nachdenken. Das ist eine wichtige Überlegung. Bisher ist es ein sehr einfaches Beispiel und die Gaskosten und die Leistung sollten konsistent sein. Es wäre ein wenig zu wortreich, die Details zu erklären. Es genügt zu sagen, dass die Kosten von .push() nicht steigen, wenn die Größe der Tabelle wächst.
Könnten Sie mir bitte erklären. Wir erstellen untergeordnete Instanzen und speichern sie im übergeordneten Vertrag. Wenn wir beispielsweise Transaktionen an einige der untergeordneten Elemente senden (wir ändern einen Wert im untergeordneten Vertrag), kostet dies dasselbe wie für Parent mit einem Array, das 100000 untergeordnete Instanzen speichert, und für Parent mit einem Array, das 100 Instanzen speichert? So wie ich es jetzt verstanden habe, zahlen wir nicht wirklich für die Speicherung schwerer Verträge, wir zahlen für Transaktionen. Wenn die Transaktion also nur dazu dient, einen Wert zu ändern oder Ether an eine Adresse zu übertragen, sollte diese Transaktion genauso viel kosten wie andere einfache Transaktionen ?
Ich denke nur, wie kann ich es richtig entwickeln. Reicht es aus, nur einen übergeordneten Vertrag zu lösen und dort andere untergeordnete Verträge zu speichern, oder sollte ich irgendwie einen Knoten auf einem Server verwenden, um neue untergeordnete Verträge separat in der Blockchain bereitzustellen?
Das genaue Design hängt vom Anwendungsfall ab. Soweit dieses Beispiel geht, so weit, so gut zu all Ihren Fragen, obwohl ich einige versteckte Annahmen spüre und einige Dinge für Sie klären würde. Dieser Thread wird für SE zu lang, also nehmen wir ihn offline. Bitte finden Sie meine Kontaktdaten im Profil und zögern Sie nicht, mich zu kontaktieren.