Was setze ich ein?

Dies hängt mit der Frage zusammen : Sind monolithische Smart Contracts besser als solche, die entkoppelt sind? , wo ich im Grunde folgendes Setup habe:

contract A {  
   int private x;          
   function save(int _x) {
       x = _x;
   }
   function get() returns (int) {
       return x;
   }
}

contract B {    
   A private a;    
   function B(address _a) {
       a = A(_a);
   }    
   function doStuff() {
       a.save(42);
   }
   function getStuff()  returns (int) {
       return a.get();
   }
}

contract C {
   B private b;    
   function C(address _b) {
       b = B(_b);
   }
   function calculateTheMeaning() {
      b.doStuff();
   }
   function getTheAnswer() returns (int) {
      return b.getStuff();
   }
}

Das funktioniert, aber anstatt die Adressen weiterzugeben, würde ich lieber die Verträge instanziieren:

contract A {  
   int private x;          
   function save(int _x) {
       x = _x;
   }
   function get() returns (int) {
       return x;
   }
}

import "A.sol";
contract B {    
   A private a;    
   function B() {
       A a = new A();
   }    
   function doStuff() {
       a.save(42);
   }
   function getStuff()  returns (int) {
       return a.get();
   }
}

import "B.sol";
contract C {
   B private b;    
   function C() {
       B b = new B();
   }
   function calculateTheMeaning() {
      b.doStuff();
   }
   function getTheAnswer() returns (int) {
      return b.getStuff();
   }
}

Das Problem ist, egal wie ich es mache ( embark blockchain, http://ethereum.github.io/browser-solidity/ , testrpc, was auch immer), ich kann das nicht richtig bereitstellen - ich bekomme entweder ungültige Sprünge oder überhaupt keine Ergebnisse.

Derzeit habe ich alle diese Verträge in separaten Dateien und ich hatte gehofft, dass die Bereitstellung von C.sol allein ausreichen würde (da es B enthält, das A enthält). Es scheint jedoch nicht. Irgendwas mache ich falsch, daher wäre ich für jeden Hinweis dankbar.

Ich bin mir nicht sicher, ob dies Ihr Problem ist oder nicht, aber ich denke, Sie brauchen a = new A(); nicht A a = neu A();
@EdmundEdgar doh! Gute Stelle! Das könnte doch sein, oder! Ich werde euch auf dem Laufenden halten. Schülerfehler ;)
Ja – das war’s! Doh! Ich stelle mich mit dem Rücken zum Zimmer in die Ecke :(
Jetzt postet und antwortet jemand und akzeptiert es ;-)

Antworten (1)

Eek! Also hier gebe ich zu, einen Schuljungenfehler gemacht zu haben :(

Wie @EdmundEdgar betonte, war der Grund, warum meine Instanziierung von newVerträgen fehlschlug, dass die Konstruktoren diese newVerträge als lokale Variablen deklarierten. Daher wurden den Klassenvariablen die Adressen nicht korrekt zugewiesen, was zu "ungültigen Sprüngen" führte. Hier ist der korrigierte Code:

contract A {  
   int private x;          
   function save(int _x) {
       x = _x;
   }
   function get() returns (int) {
       return x;
   }
}

import "A.sol";
contract B {    
   A private a;    
   function B() {
       a = new A();
   }    
   function doStuff() {
       a.save(42);
   }
   function getStuff()  returns (int) {
       return a.get();
   }
}

import "B.sol";
contract C {
   B private b;    
   function C() {
       b = new B();
   }
   function calculateTheMeaning() {
      b.doStuff();
   }
   function getTheAnswer() returns (int) {
      return b.getStuff();
   }
}

Doh!