So greifen Sie auf Objekte aus verschiedenen Verträgen zu

Ziel : Ich möchte ein Soliditätsprogramm erstellen, das 3+ Verträge umfasst. Das bedeutet, dass ich einen Vertrag habe (nennen wir ihn vorerst Master), der darauf abzielt, alles einzurichten. Das bedeutet, dass dieser Vertrag eine Funktion hat, die nach Adressen von Verträgen fragt, die miteinander interagieren sollen. Der Master speichert diese Adressinformationen und kann sie später an andere Verträge weitergeben. Ich werde 3+ andere Verträge haben, die diese "Kontaktinformationen" aus dem Rahmenvertrag erhalten, und dann beginnen diese 3+ miteinander zu interagieren (Ändern anderer Variablen, Aufrufen von Funktionen anderer Verträge)

Beispiel : Vertrag hat eine Setup-Funktion, die nach den Adressen von Vertrag A und B fragt. Er speichert diese Adressen und ruft Funktion 1 von Vertrag A auf. Jetzt erledigt Funktion 1 von Vertrag A einiges und sucht dann die Adresse von Vertrag B (diese ist, wo ich kämpfe) und ruft Funktion 2 auf, die zu Vertrag B gehört.

Frage : Kann mir jemand bei dieser Frage helfen und mir einen Beispielcode geben? Ich habe bereits versucht, eine Struktur mit den Adressen vom Master an A und B zu übergeben, versucht, sie in einem Mapping zu speichern und versucht, meine Master-Vertragsdaten per Vererbung für A und B zugänglich zu machen.

Wenn Sie Probleme haben, diese Frage zu verstehen, können Sie sie gerne stellen ;)

Antworten (2)

Aus Zeitgründen kann ich indirekt mit einem (hoffentlich) klaren Muster antworten.

pragma solidity ^0.4.11;

contract A {

    function talkToMe() public constant returns(bool success) {
        return true;
    }
}

contract B {

    A a; // contract "A" called "a"

    event LogResponse(bool whatItSaid);

    function B() {
        a = new A(); // deploy B and it will make it's own A and note the address
    }

    function prove() public returns(bool success) {
        bool response = a.talkToMe();
        LogResponse(response);
        return response;
    }

    function newA(address addressA) public returns(bool success) {
        a = A(addressA); // start using previously deployed A 
        return true;
    }
}

Hier ist es Remix, um zu zeigen, dass es funktioniert.

  1. B bereitstellen
  2. prove()

Geben Sie hier die Bildbeschreibung ein

Diese Antwort geht auf einige weitere Bedenken ein, z. B. die Verfolgung der von der "Fabrik" generierten Verträge. Gibt es ein einfaches Vertragsfabrik-Muster?

Ich hoffe es hilft.

Danke für deine schnelle Antwort. Ich weiß, dass das Muster, das du mir gegeben hast, funktioniert, denn das ist im Grunde das, was ich bereits habe :) Ich glaube, ich war in dieser Hinsicht nicht klar, was mein Fehler ist! Ich werde versuchen, ein Bild meines Codes einzufügen, um zu zeigen, was ich zu erreichen versuche

Geben Sie hier die Bildbeschreibung ein

Oben sehen Sie meinen Code. Es verwendet das Muster, das Sie mir bereits gezeigt haben, und funktioniert gut! Alle Verträge können interagieren. Jetzt möchte ich das ein wenig aufräumen. Ich habe die Dinge, die ich ändern möchte, gelb markiert.

Für mich wäre es cool, das ganze "gelbe Zeug" aus dem Vertrag "ObjA" zu extrahieren, um es in den Vertrag "masterObj" zu packen. Also erstelle ich gerne so etwas wie ein Array/Mapping, in das ich alle Verträge einfüge (sagen wir 'a', das sich dann auf den konkreten ObjA-Vertrag bezieht) und dann, wenn ich mit einem Vertrag interagiere, übergebe ich einfach dieses Array/Mapping und dann er kann die Vertragsadresse aller anderen Verträge aus diesem Array/Mapping lesen.

Also im Grunde möchte ich nur "Berechnungen" in den Verträgen A bis Z haben und alles andere, was Verwaltung im MasterObj-Vertrag ist. Hast du eine Idee, wie man das realisieren kann? Ich hoffe meine Frage wird jetzt klarer :) Und übrigens vielen Dank für deine Zeit!