Это связано с тем, лучше ли монолитные смарт-контракты, чем несвязанные? , где у меня в основном есть следующая настройка:
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). Однако, похоже, нет. Я делаю что-то не так, поэтому я был бы признателен за любые указатели.
Эй! Так вот тут я признаю ошибку школьника :(
Как указал @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();
}
}
Дох!
Эдмунд Эдгар
светлячок
светлячок
q9f