Контракт не инициализируется

Проблемы с контрактом при создании другого контракта с использованием среды разработки Truffle. Вот мои шаги -

truffle console
var node = Node.deployed()
node.then(function(instance){node=instance})
var relay = node.createRelay()

Получение этого ответа после createRelay:

{ tx: 
'0x5172bd954f72d31bb73278a10343ddfbd613c4938162b5ae9574b2e173271d03',
  receipt:
   { transactionHash: 
'0x5172bd954f72d31bb73278a10343ddfbd613c4938162b5ae9574b2e173271d03',
     transactionIndex: 0,
     blockHash: 
'0xcae09bb248baf2bc0cd9065c629958336874c2ae8c5b1e5fbd5f867600d63c56',
     blockNumber: 40,
     gasUsed: 159039,
     cumulativeGasUsed: 159039,
     contractAddress: null,
     logs: [] },
   logs: [] }

Как видите, contractAddressесть null.

Вот мои контракты:

pragma solidity ^0.4.2;
import "./Relay.sol";

contract Node {

uint public fee;
address public owner;
address[] activeRelays;

  function Node() {
    owner = msg.sender;
    fee = 10;
  }

  function createRelay () returns (address) {
    address relay = new Relay();
    activeRelays.push(relay);
    return relay;
  }
}

Реле:

pragma solidity ^0.4.2;

contract Relay {
address public owner;

  function Relay() {
    owner = msg.sender;
  }

  function fundRelay() payable returns (bool) {

  }

  function releaseFunds () {

  }
}

Спасибо за любую помощь.

Ответы (1)

Пропускает шаг. Простой путь вперед:

Во-первых ,address[] public publicRelays; // easy access with free getter using "public"

Во-вторых , получение хэша транзакции при отправке транзакции является нормальным явлением. Мы не ожидаем результата. Следовательно, таким образом мы не получим контрактный адрес.

Вместо этого подождите, пока транзакция будет добыта. Вначале просто наблюдайте за своим узлом/майнером. Когда вы уверены, что блок был добыт, из этого следует, что вы сможете:

> var relay;
> node.publicRelays.call(0).then(function(response) { relay=response; });
> relay
0x123...

Это означает, что 1) опросите publicRelay()получателя и спросите или задайте строку 0 (потому что это массив). 2) Дождаться ответа... 3) Посмотреть ответ.

Надеюсь, поможет.

Роб совершенно прав, просто позвольте мне добавить, почему: транзакции возвращают только идентификаторы транзакций. Таким образом, даже если вы установили ` createRelay ` для возврата адреса, вы действительно просто получите обратно идентификатор tx. Возврат данных из функции вне EVM работает только с вызовами (чтением), тогда как функции внутри контрактов могут возвращать данные.