Solidität: Wie kann ein Vertrag B, der aus Vertrag A brennt, einen anderen Vertrag generieren?

Wenn wir wissen, dass Vertrag A in Zukunft einen anderen Vertrag erstellt: Vertrag B, wenn wir Vertrag A bereitstellen, fügen wir auch den Code von Vertrag B in die Transaktion ein. Also senden wir den folgenden Code an die Blockchain, um Vertrag A bereitzustellen:

pragma solidity ^0.4.4;

contract Contract_A {

address public b_addr;
function Contract_A(){

 }
  function create() {
    Contract_B bb = new Contract_B();
    b_addr = address(bb); }

function fetch(){
    Contract_B cc = Contract_B(b_addr);
    cc.change();}    
}

contract Contract_B {

  uint public val;
  function Contract_B(){
   val=7;}
   function change(){
   val+=90;}
  }

Angenommen, Vertrag B möchte in der Zukunft einen weiteren Vertrag erstellen: Vertrag C.

Die Frage ist: Wo sollen wir den Code von Vertrag C hinstellen?

Antworten (1)

Ich habe in der Remix IDE etwas wie folgt ausprobiert und es hat funktioniert.

pragma solidity ^0.4.4;

contract Contract_A {

address public b_addr;
function Contract_A(){

 }
  function create() {
    Contract_B bb = new Contract_B();
    b_addr = address(bb); }

function fetch(){
    Contract_B cc = Contract_B(b_addr);
    cc.change();}    
}

contract Contract_B {

    address public c_addr;
  uint public val;
  function Contract_B(){
   val=7;}
   function change(){
   val+=90;}

   function create() {

    Contract_C cc = new Contract_C();
    c_addr = address(cc); 

   }
}


contract Contract_C {

    //contract C code
}

AFAIK, Sie können entweder eine in Vertrag A definierte Funktion verwenden, um einen Vertrag von B zu erstellen und aufzurufen (jedes Mal, wenn Sie die Funktion aufrufen, wird eine Instanz von Vertrag B erstellt), oder Sie können den Adresswert des erstellten Vertrags B zuweisen beim allerersten Mal und prüfen, ob die Adresse bei jedem Aufruf der Funktion gesetzt ist.

danke für die Antwort! Frage: Wie können wir mit Vertrag B interagieren (sogar im Remix)? Müssen wir sowohl Vertrag B als auch Vertrag C erwähnen? Wenn wir mit Vertrag A interagieren, benötigen wir im Allgemeinen ABI aller drei Verträge; wenn wir mit B interagieren, brauchen wir ABI von Vertrag B und C, und wenn wir mit Vertrag C interagieren, brauchen wir ABI von Vertrag C?
AFAIK, Sie können entweder eine in Vertrag A definierte Funktion verwenden, um einen Vertrag von B zu erstellen und aufzurufen (jedes Mal, wenn Sie die Funktion aufrufen, wird eine Instanz von Vertrag B erstellt), oder Sie können den Adresswert des erstellten Vertrags B zuweisen Beim allerersten Mal und überprüfen Sie, ob die Adresse bei jedem Aufruf der Funktion festgelegt ist. Dies kann wie ein Singleton-Muster aussehen und wird nicht bei jedem Aufruf B-Verträge erstellen. Und wenn Sie den Wert der Adresse von B zurückgeben, nachdem sie erstellt wurde, können Sie B direkt von web3 aus anrufen. In diesem Fall benötigen Sie die ABI
Ja, habe ich; Danke. Um mit Vertrag B oder C zu interagieren, habe ich den in meinem Kommentar erläuterten Ansatz verwendet. Danke nochmal.
Ja, das ist richtig. Der in meinem ersten Kommentar erwähnte: ... Wenn ich mit dem bereitgestellten Vertrag B interagiere, muss ich die ABI von Vertrag B und C einbeziehen.
Großartig! Viel Glück :)