Что мне развертывать?

Это связано с тем, лучше ли монолитные смарт-контракты, чем несвязанные? , где у меня в основном есть следующая настройка:

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

Это работает, но вместо передачи адресов я бы предпочел создавать экземпляры контрактов:

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

Проблема в том, что независимо от того, как я это делаю ( embark blockchain, http://ethereum.github.io/browser-solidity/ , testrpc, что угодно), я не могу правильно развернуть это - я либо получаю недопустимые переходы, либо вообще никаких результатов.

В настоящее время у меня есть все эти контракты в отдельных файлах, и я надеялся, что будет достаточно развертывания только C.sol (поскольку он включает B, который включает A). Однако, похоже, нет. Я делаю что-то не так, поэтому я был бы признателен за любые указатели.

Я не уверен, является ли это вашей проблемой или нет, но я думаю, вам нужно a = new A(); не А а = новый А();
@EdmundEdgar Дох! Хорошее место! Это вполне могло быть, не так ли! Я буду держать вас в курсе. Ошибка школьника ;)
Ага - это было! Дох! Пойду встану в угол спиной к комнате :(
Теперь кто-нибудь напишите, ответьте и примите это ;-)

Ответы (1)

Эй! Так вот тут я признаю ошибку школьника :(

Как указал @EdmundEdgar, причина сбоя создания экземпляров newконтрактов заключалась в том, что конструкторы объявляли эти newконтракты как локальные переменные. Следовательно, переменные класса не имели правильно назначенных им адресов, что вызывало «недопустимые переходы». Вот исправленный код:

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

Дох!