Contrato no inicializado

Tener problemas con un contrato creando otro contrato utilizando el entorno de desarrollo de Truffle. Aquí están mis pasos -

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

Obtener esta respuesta después de createRelay:

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

Como puedes ver, contractAddresses null.

Estos son mis contratos:

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

Relé:

pragma solidity ^0.4.2;

contract Relay {
address public owner;

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

  function fundRelay() payable returns (bool) {

  }

  function releaseFunds () {

  }
}

Gracias por cualquier ayuda.

Respuestas (1)

Falta un paso. Camino sencillo a seguir:

Primero ,address[] public publicRelays; // easy access with free getter using "public"

En segundo lugar , es normal obtener un hash de transacción cuando envía una transacción. No esperamos un resultado. Ergo, no obtendremos la dirección del contrato de esa manera.

En su lugar, espere a que se extraiga la transacción. Al principio, solo observe su nodo/minero. Cuando esté seguro de que se ha minado un bloque, entonces debería poder:

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

Es decir, 1) interrogar al publicRelay()captador y preguntar o fila 0 (porque es una matriz). 2) Esperar la respuesta... 3) Ver la respuesta.

Espero eso ayude.

Rob tiene toda la razón, solo déjame agregar por qué: las transacciones solo devuelven ID de transacciones. Entonces, aunque haya configurado ` createRelay ` para devolver una dirección, de hecho solo recuperará la ID de tx. La devolución de datos desde una función fuera de EVM solo funciona con llamadas (lectura), mientras que las funciones dentro de los contratos pueden devolver datos.