Vertrag wird nicht initialisiert

Probleme mit einem Vertrag, der einen anderen Vertrag mit der Truffle-Entwicklungsumgebung erstellt. Hier sind meine Schritte -

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

Diese Antwort erhalten nach createRelay:

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

Wie Sie sehen können, contractAddressist null.

Hier meine Verträge:

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

Relais:

pragma solidity ^0.4.2;

contract Relay {
address public owner;

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

  function fundRelay() payable returns (bool) {

  }

  function releaseFunds () {

  }
}

Vielen Dank für jede Hilfe.

Antworten (1)

Es fehlt ein Schritt. Einfacher Weg nach vorn:

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

Zweitens ist es normal, einen Transaktions-Hash zu erhalten, wenn Sie eine Transaktion übermitteln. Wir erwarten kein Ergebnis. Ergo kommen wir so nicht an die Vertragsadresse.

Warten Sie stattdessen, bis die Transaktion abgebaut ist. Beobachten Sie zu Beginn einfach Ihren Node/Miner. Wenn Sie sicher sind, dass ein Block abgebaut wurde, sollten Sie Folgendes tun können:

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

Das heißt, 1) den publicRelay()Getter abfragen und oder Zeile 0 fragen (weil es ein Array ist). 2) Warten Sie auf die Antwort ... 3) Sehen Sie sich die Antwort an.

Ich hoffe es hilft.

Rob hat völlig Recht, lassen Sie mich nur den Grund hinzufügen: Transaktionen geben nur Transaktions-IDs zurück. Obwohl Sie ` createRelay ` so eingestellt haben, dass es eine Adresse zurückgibt, erhalten Sie tatsächlich nur die tx-ID zurück. Das Zurückgeben von Daten von einer Funktion außerhalb der EVM funktioniert nur mit Aufrufen (Lesen), während Funktionen innerhalb von Verträgen Daten zurückgeben können.