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.
Eek! Also hier gebe ich zu, einen Schuljungenfehler gemacht zu haben :(
Wie @EdmundEdgar betonte, war der Grund, warum meine Instanziierung von new
Verträgen fehlschlug, dass die Konstruktoren diese new
Verträ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!
Edmund Edgar
Glühwächter
Glühwächter
q9f