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 createId
wurde zuvor aufgerufen getPermissions
).
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_getTransactionReceipt
kann 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_getCode
richtig 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_getCode
der kompilierte Code unter Angabe der Vertragsadresse zurückgegeben. Außerdem habe ich die double(int)
Methode zweimal (mit zwei verschiedenen Eingabewerten) mithilfe eth_call
der 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;
}
}
Dieses Problem wurde behoben. Es stellte sich heraus, dass der IdMgmt
Vertrag wegen unzureichendem Gas nicht tatsächlich eingesetzt wurde. Der Vertrag wurde ausgeführt und die Methoden funktionierten, als ich mehr Gas lieferte.
Der einfachere test
Vertrag 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.
Niksmac
Ajoy Bhatia
eth_getCode
kein 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
Niksmac
Ajoy Bhatia
eth_getCode
der bereitgestellte Code für einen viel einfacheren Vertrag korrekt zurückgegeben wurde, dachte ich, dass das Problem im Solidity-Code liegen könnte.Niksmac
Ajoy Bhatia
Ajoy Bhatia
q9f
eth_getCode
Anrufs verwenden. Ich möchte versuchen, dies zu reproduzieren.