Ethcore stellt den Vertrag nicht über die web3-JavaScript-API bereit

Ich habe etwas Solidity-Code geschrieben, mit einer Setter-Methode createId, um ein Name-Wert-Paar in den Vertragsspeicher zu schreiben, und einer Getter-Methode getPermissions, um den Wert abzurufen, der einem bestimmten Namen zugeordnet ist. Es funktioniert korrekt in Browser-Solidity (Im Screenshot unten createIdwurde zuvor aufgerufen getPermissions).(angehängter Screenshot)

Dann habe ich die web3-JavaScript-API von einer NodeJS-App verwendet, um eine Transaktion zur Vertragsbereitstellung an einen Paritätsknoten (Ethcore) zu senden, der mit einer privaten Kette verbunden ist. Diese Transaktion wird abgebaut. Mit der JSON-RPC-API eth_getTransactionReceiptkann ich den Transaktionsbeleg mit der Vertragsadresse abrufen. Wenn ich jedoch eine JSON-RPC-API eth_getCode-Anfrage mit der Vertragsadresse sende, bekomme ich nur Folgendes:{ "jsonrpc": "2.0", "result": "0x", "id": 1 }

Um zu testen, ob es nicht eth_getCoderichtig funktioniert, habe ich die JSON-RPC-API verwendet eth_call, um den Setter (der keinen Rückgabewert hat) aufzurufen, um einen Wert festzulegen, aber der Aufruf des Getters gibt auch ein leeres Ergebnis zurück. Der Screenshot zeigt, dass der Getter in Browser-Solidity den richtigen Wert zurückgegeben hat.

Gibt es etwas, das ich vermisse? Vielen Dank für deine Hilfe.

EDIT: Einige zusätzliche Informationen. Ich habe den folgenden Solidity-Code kompiliert und bereitgestellt:

contract test { function double(int a) returns(int) { return 2*a; } }

In diesem Fall wird eth_getCodeder kompilierte Code unter Angabe der Vertragsadresse zurückgegeben. Außerdem habe ich die double(int)Methode zweimal (mit zwei verschiedenen Eingabewerten) mithilfe eth_callder JSON-RPC-API aufgerufen und in beiden Fällen den richtigen Rückgabewert erhalten.

Bedeutet das, dass mit dem Code des anderen Vertrags (der komplexer ist als dieser Testvertrag) etwas nicht stimmt, obwohl er in Browser-Solidity korrekt funktioniert? Gibt es bekannte Probleme in der Browsersolidität, die dies verursachen würden? Gibt dies einen Hinweis darauf, welches Problem in diesem Vertrag vorliegen könnte?

Die Solidity-Quelle, die in Browser-Solidity korrekt funktioniert:

pragma solidity ^0.4.7;

contract owned {
  address owner;
  function owned() {
    owner = msg.sender;
  }
}

contract mortal is owned {
  function kill() {
    if (msg.sender == owner) selfdestruct(owner);
  }
}

contract IdMgmt is mortal {

  struct acl {
    string dataType;
    string permissions;
  }

  mapping (address => acl) public aclOf;

  function IdMgmt() { }

  function createId(address _user, string _dataType, string _permissions) {
    aclOf[_user].dataType = _dataType;
    aclOf[_user].permissions = _permissions;
  }

  function getPermissions(address _user, string _dataType) constant
    returns (string userPermissions) {

    if (stringsEqual(aclOf[_user].dataType, _dataType)) {
      userPermissions = aclOf[_user].permissions;
    }
    else {
      userPermissions = "NO DATA";
    }
  }

  function stringsEqual(string _a, string _b) internal returns (bool) {
    bytes memory a = bytes(_a);
    bytes memory b = bytes(_b);
    if (a.length != b.length) {
      return false;
    }
    for (uint i = 0; i < a.length; i ++) {
      if (a[i] != b[i]) return false;
    }
    return true;
  }
}
Bitte beachten Sie meine spätere EDIT. Das Problem ist, dass eth_getCodekein Code an die Vertragsadresse zurückgegeben wird. eth_getCode Wenn jedoch ein viel einfacherer Vertrag bereitgestellt wurde, wird der bereitgestellte Code zurückgegeben. Es gibt also möglicherweise ein Problem im Vertragscode, obwohl die Bereitstellungstransaktion abgebaut wird und die Quittung eine Vertragsadresse zeigt. Die Ursache steht nicht im Zusammenhangeth_call
Wenn Sie ein Problem in der Soliditätsquelle vermuten, warum veröffentlichen Sie die Quelle nicht? stackoverflow.com/help/mcve
Code hinzugefügt. Erst nachdem ich gesehen hatte, dass eth_getCodeder bereitgestellte Code für einen viel einfacheren Vertrag korrekt zurückgegeben wurde, dachte ich, dass das Problem im Solidity-Code liegen könnte.
Jetzt wird Ihre Frage zur Wiedereröffnung eingereicht und wird bald online sein.
@niksmac - warum zeigt meine Frage oben immer noch ein Banner mit der Meldung: "Diese Frage hat möglicherweise bereits eine Antwort hier: Wie ..." ? Ich dachte, nachdem ich den Code hinzugefügt habe und die Frage live geht, würde diese Nachricht verschwinden.
@AjoyBhatia Bitte teilen Sie die Vertragsadresse und den vollständigen Befehl mit, den Sie zum Tätigen eines eth_getCodeAnrufs verwenden. Ich möchte versuchen, dies zu reproduzieren.

Antworten (1)

Dieses Problem wurde behoben. Es stellte sich heraus, dass der IdMgmtVertrag wegen unzureichendem Gas nicht tatsächlich eingesetzt wurde. Der Vertrag wurde ausgeführt und die Methoden funktionierten, als ich mehr Gas lieferte.

Der einfachere testVertrag mit nur einer Funktion, um das Doppelte seiner ganzzahligen Eingabe zurückzugeben, benötigte weniger Gas, also funktionierte es.

Macht Sinn, aber es wäre gut, wenn die Protokolle dies gezeigt hätten, aber die Protokolle zeigten nur, dass es erfolgreich abgebaut wurde. Außerdem wurde in der Benutzeroberfläche des Parity-Browsers der Vertrag als bereitgestellt angezeigt, und die Adresse wurde angezeigt. Also sah alles gut aus.